__author__ = 'sdjkx'

from ast import If
import oss2
import os
import shutil

from PIL import Image

from libs.ImageFile import ImageFile
from libs.Config import Config


class OssFileManager:
    def __init__(self, mydb ):
        self.imageFileDict = {}
        self.downFileMaxNum = 50
        self.mydb = mydb

        self.basePath = Config.DownFilePath
        if not os.path.exists(self.basePath):
            os.makedirs(self.basePath)

    def downFile(self):
        # 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
        auth = oss2.Auth(Config.AccessKeyId, Config.AccessKeySecret)
        # auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
        # Endpoint以杭州为例，其它Region请按实际情况填写。

        bucket = None
        bucketName = ""

        # # 打开数据库连接（ip/数据库用户名/登录密码/数据库名）
        # db = pymysql.connect(Config.dbHost, Config.dbUserName, Config.dbPassword, Config.dbName)
        # # 使用 cursor() 方法创建一个游标对象 cursor
        # cursor = db.cursor()


        try:
            # SQL 查询语句
            sql = "select file_id,file_name,yun_type, bucket_name,yun_name from u_image_file where file_status=0 and file_type in(1,3)  limit "+ str(self.downFileMaxNum)

            # 执行SQL语句, 获取所有记录列表
            results = self.mydb.executeSql(sql)

            fileIdList = ""
            for row in results:
                # def __init__(self, fileId, fileName,yunType,bucketName, yunName):
                imageFile = ImageFile (row[0], row[1], row[2], row[3],row[4])
                self.imageFileDict[imageFile.get_fileName()] =  imageFile

                # bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
                if bucket == None or bucketName != imageFile.get_bucketName():
                    bucket = oss2.Bucket(auth, Config.BucketUrl, imageFile.get_bucketName())
                    bucketName = imageFile.get_bucketName()

                # 构建文件路径
                filePath = self.basePath + str(imageFile.get_yunName()).split("/")[0]
                if not os.path.exists(filePath):
                    os.makedirs(filePath)

                # 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖，不存在则新建。
                #  <yourLocalFile>由本地文件路径加文件名包括后缀组成，例如/users/local/myfile.txt。
                bucket.get_object_to_file(imageFile.get_yunName(), self.basePath + imageFile.get_yunName())
                fileIdList += str(row[0]) + ","

            if(fileIdList != ""):
                # 文件状态：0未处理，1已下载，2处理完成，3已检查, 9删除
                sql = "update u_image_file set file_status=1 where file_id in (" + fileIdList[0:-1] + ")"
                print("下载文件后更新文件状态的SQL： " + sql)
                self.mydb.executeCommit(sql)

        except:
            print("Error: unable to fecth data")

    def uploadFileToYunServer(self):
        return

    def uploadFileToLocalServer(self):
        return

    def deleteFile(self, fileId, filePath, xmlSaveDir, classItemDict):
        '''
        删除一个文件和他的复本及XML文件，并修改数据库里的设置为删除状态
        :param filePath:
        :param xmlSaveDir:
        :param classItemDict:
        :return:
        '''
        filePath = str(filePath)
        fileName = self.getFileName(filePath)
        userId = ""
        fileNameInDb = ""
        if fileId > 0:
            hadInDb = True
        else:
            hadInDb = False

        if hadInDb == False:
            if fileName in self.imageFileDict:
                fileId = self.imageFileDict[fileName]
                hadInDb = True
            elif fileName.find("-") > 0:
                arr = fileName.split("-")
                userId = arr[0]
                fileNameInDb = arr[1]
                hadInDb = True

        # 20200518/100007-15897697197613.png
        if hadInDb:
            self.updateFileStatus(9,userId, fileNameInDb, fileId)

        # 删除复制的文件
        for item in classItemDict.keys():
            dstPath = Config.ClassFilePath +"室内室外分类/"+ classItemDict[item].get_enName()
            if not os.path.exists(dstPath):
                continue

            dstFile = dstPath + "/" + fileName
            if os.path.exists(dstFile):
                os.remove(dstFile)

        # 删除XML文件
        dstFile = xmlSaveDir + "/" + fileName.split(".")[0] + ".xml"
        if os.path.exists(dstFile):
            os.remove(dstFile)

        # 删除本地文件
        if os.path.exists(filePath):
            os.remove(filePath)
            if filePath.find("train") > 0:
                filePath = filePath.replace("train", "cut")
                os.remove(filePath)
                
        else:
            print("文件路径错误，文件不存在：" + filePath)

    def updateFileStatus(self, status, userId = "", fileName = "", fileId = 0):
        try:
            # 文件状态：0未处理，1已下载，2处理完成，3已检查, 9删除
            if fileId > 0:
                sql = "update u_image_file set file_status="+str(status)+" where file_id=" + str(fileId)
            else:
                sql = "update u_image_file set file_status="+str(status)+" where user_id=" + str(userId) + " and file_name = '"+ fileName +"'"
            self.mydb.executeCommit(sql)
        except:
            print("Error: unable to fecth data")
            return False

        return True

    def copyFileToClass(self, filePath, selectClassList):
        '''
        把文件压缩复制到指定的分类目录里
        :param filePath:源文件
        :param selectClassList:分类目录列表
        :return:
        '''
        dstFile = ""
        fileName = self.getFileName(filePath)

        for item in selectClassList:
            dstPath = Config.ClassFilePath +"室内室外分类/"+ item.get_enName()
            if not os.path.exists(dstPath):
                os.makedirs(dstPath)

            if dstFile == "":
                dstFile = dstPath + "/" + fileName
                self.compressImage(filePath,dstFile)
            else:
                secondFile = dstPath + "/" + fileName
                shutil.copy(dstFile,secondFile)

    def compressImage(self,srcFile,dstFile):
        '''
        把源文件压缩后保存为目标文件
        :param srcFile:
        :param dstFile:
        :return:
        '''
        # 打开原图片缩小后保存，可以用if srcFile.endswith(".jpg")或者split，splitext等函数等针对特定文件压缩
        sImg = Image.open(srcFile)
        w, h = sImg.size
        w1 = 1
        h1 = 1

        if w > h:
            w1 = 500
            h1 = 500 / w * h
        else:
            w1 = 500 / h * w
            h1 = 500

        dImg = sImg.resize((int(w1), int(h1)),
                           Image.ANTIALIAS)  # 设置压缩尺寸和选项，注意尺寸要用括号
        # 也可以用srcFile原路径保存,或者更改后缀保存，save这个函数后面可以加压缩编码选项JPEG之类的
        dImg.save(dstFile)

    def getFileName(self, filePath):
        fileArr = str(filePath).split(os.sep)
        return fileArr[len(fileArr) - 1]

